package com.zyl.file.service;

import com.zyl.file.dto.SplitUploadDTO;
import com.zyl.file.dto.StFileDTO;
import com.zyl.file.po.StFile;
import com.zyl.file.vo.SplitUploadVO;

/**
 * 分片上传
 *
 * @author zyl
 * @Description
 * @since  2023/7/20 10:03
 */
public interface SplitUploadTaskService {

    /** -------------------------------------------------- 前端分片上传 --------------------------------------------------*/

    /**
     * 根据md5标识获取分片上传任务
     * @param identifier 文件md5
     * @return
     */
    StFile getByIdentifier (String identifier);

    /**
     * 初始化一个任务
     * @param param
     * @param id
     * @return
     */
    SplitUploadDTO initTask(SplitUploadVO param, Long id);

    /**
     * 获取文件地址
     * @param endpoint 域名
     * @param bucket 存储桶
     * @param objectKey 文件在存储桶的路径
     * @return
     */
    String getPath (String endpoint,String bucket, String objectKey);

    /**
     * 获取上传进度
     * @param identifier 文件md5
     * @return
     */
    SplitUploadDTO getTaskInfo(String identifier);


    /**
     * 秒传 (OSS中从一个存储桶上传到另一个存储桶)
     * @param param
     * @param userId
     * @return
     */
    SplitUploadDTO secondUpload(SplitUploadVO param, Long userId);

    /**
     * 生成预签名上传url
     * @param identifier 文件md5
     * @param partNumber 分片位置
     * @param type 区分移动端和pc端，移动端传值为0，pc端不传
     * @param isOpen 是否是open
     * @return
     */
    String genPreSignUploadUrl(String identifier, Integer partNumber, String type,Boolean isOpen);

    /**
     * 合并分片
     * @param identifier 文件md5
     * @param isFlat 是否偏离矫正
     * @return
     */
    StFile merge(String identifier, Boolean isFlat);


    /** -------------------------------------------------- 后端分片上传 --------------------------------------------------*/

    /**
     * S3后端分片上传
     * @param fileByte 文件
     * @param userId 用户id
     * @param stEquipmentId 设备id
     * @return
     */
    StFileDTO useS3Upload(byte[] fileByte, Long userId, Long stEquipmentId , String fileName);

    /**
     * 取消上传
     * @param md5
     * @param stEquipmentId
     */
    void cancelFileUpload(String md5 ,String stEquipmentId);

}
